package com.tj.jinzao;

import android.app.ActivityManager;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.Environment;
import android.support.multidex.MultiDexApplication;
import android.text.TextUtils;
import android.util.DisplayMetrics;

import com.netease.nim.uikit.api.NimUIKit;
import com.netease.nim.uikit.api.UIKitOptions;
import com.netease.nim.uikit.api.wrapper.NimUserInfoProvider;
import com.netease.nim.uikit.business.contact.core.query.PinYin;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.SDKOptions;
import com.netease.nimlib.sdk.StatusBarNotificationConfig;
import com.netease.nimlib.sdk.auth.LoginInfo;
import com.netease.nimlib.sdk.mixpush.MixPushConfig;
import com.netease.nimlib.sdk.util.NIMUtil;
import com.tencent.bugly.crashreport.CrashReport;
import com.tj.jinzao.activity.MainActivity;
import com.tj.jinzao.common.Constant;
import com.tj.jinzao.common.Settings;
import com.tj.jinzao.manager.UserManager;
import com.tj.jinzao.model.City;
import com.tj.jinzao.model.User;
import com.tj.jinzao.widgets.WorkerThread;

import java.io.IOException;

/**
 * 启动Application
 * Created by wjy on 2015/11/5.
 */
public class App extends MultiDexApplication {
    public static final String TAG = BuildConfig.TAG_PREFIX + "App";

    private Bitmap mCameraBitmap;

    public static City sCity;
    public static boolean isShare=false;
    public static int type;
    public static int type_bind;
    public static String open_id;
    public static String imagePath;

    private static App sInstance;
    private Thread.UncaughtExceptionHandler mExceptionHandler;
    private WorkerThread mWorkerThread;
    private ChatManager mChatManager;

    public synchronized void initWorkerThread() {
        if (mWorkerThread == null) {
            mWorkerThread = new WorkerThread(getApplicationContext());
            mWorkerThread.start();

            mWorkerThread.waitForReady();
        }
    }

    public synchronized WorkerThread getWorkerThread() {
        return mWorkerThread;
    }

    public synchronized void deInitWorkerThread() {
        mWorkerThread.exit();
        try {
            mWorkerThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        mWorkerThread = null;
    }
    public ChatManager getChatManager() {
        return mChatManager;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        sCity = new City();
        sCity.setName("全国城市");
        sInstance = this;
        Constant.TRACE = (!BuildConfig.BUILD_TYPE.equals("release")) ? true
                : Settings.getBoolean(this, Settings.KEY_PREF_ENABLE_TRACING, false);
        initExceptionHandler();
        mChatManager = new ChatManager(this);
        mChatManager.init();

        // 以下逻辑只在主进程初始化时执行
        if (NIMUtil.isMainProcess(this)) {

            // 注册自定义推送消息处理，这个是可选项
//            NIMPushClient.registerMixPushMessageHandler(new DemoMixPushMessageHandler());

            // 初始化红包模块，在初始化UIKit模块之前执行
//            NIMRedPacketClient.init(this);
            // init pinyin
            PinYin.init(this);
            PinYin.validate();
        }
        // SDK初始化（启动后台服务，若已经存在用户登录信息， SDK 将完成自动登录）
        NIMClient.init(sInstance, getLoginInfo(), options());
        // 以下逻辑只在主进程初始化时执行
        if (NIMUtil.isMainProcess(sInstance)) {
            // 在主进程中初始化UI组件，判断所属进程方法请。
            initUIKit();
        }
       /* Bugly SDK初始化
        * 参数1：上下文对象
        * 参数2：APPID，平台注册时得到,注意替换成你的appId
        * 参数3：是否开启调试模式，调试模式下会输出'CrashReport'tag的日志
        */
        CrashReport.initCrashReport(getApplicationContext(), "1205e25d54", true);

    }
    private void initUIKit() {
        // 初始化
        NimUIKit.init(sInstance, buildUIKitOptions());

    }
    public Bitmap getCameraBitmap() {
        return mCameraBitmap;
    }

    public void setCameraBitmap(Bitmap mCameraBitmap) {
        if (mCameraBitmap != null) {
            recycleCameraBitmap();
        }
        this.mCameraBitmap = mCameraBitmap;
    }

    public void recycleCameraBitmap() {
        if (mCameraBitmap != null) {
            if (!mCameraBitmap.isRecycled()) {
                mCameraBitmap.recycle();
            }
            mCameraBitmap = null;
        }
    }

    private UIKitOptions buildUIKitOptions() {
        UIKitOptions options = new UIKitOptions();
        // 设置app图片/音频/日志等缓存目录
        options.appCacheDir = getAppCacheDir(sInstance) + "/app";
        return options;
    }


    // 如果返回值为 null，则全部使用默认参数。
    private SDKOptions options() {
        SDKOptions options = new SDKOptions();

        // 如果将新消息通知提醒托管给 SDK 完成，需要添加以下配置。否则无需设置。
        StatusBarNotificationConfig config = new StatusBarNotificationConfig();
        config.notificationEntrance = MainActivity.class; // 点击通知栏跳转到该Activity
        config.notificationSmallIconId = R.drawable.ic_camera;

        // 呼吸灯配置
        config.ledARGB = Color.GREEN;
        config.ledOnMs = 1000;
        config.ledOffMs = 1500;
        // 通知铃声的uri字符串
//        config.notificationSound = "android.resource://com.netease.nim.demo/raw/msg";
        options.statusBarNotificationConfig = config;

        // 配置保存图片，文件，log 等数据的目录
        // 如果 options 中没有设置这个值，SDK 会使用采用默认路径作为 SDK 的数据目录。
        // 该目录目前包含 log, file, image, audio, video, thumb 这6个目录。
        String sdkPath = getAppCacheDir(sInstance) + "/nim"; // 可以不设置，那么将采用默认路径
        // 如果第三方 APP 需要缓存清理功能， 清理这个目录下面个子目录的内容即可。
        options.sdkStorageRootPath = sdkPath;

        // 配置是否需要预下载附件缩略图，默认为 true
        options.preloadAttach = true;
        options.mixPushConfig = buildMixPushConfig();
        // 配置附件缩略图的尺寸大小。表示向服务器请求缩略图文件的大小
        // 该值一般应根据屏幕尺寸来确定， 默认值为 Screen.width / 2
//        options.thumbnailSize = ${Screen.width} / 2;

        // 用户资料提供者, 目前主要用于提供用户资料，用于新消息通知栏中显示消息来源的头像和昵称
        options.userInfoProvider = new NimUserInfoProvider(sInstance);
        return options;
    }

    private static MixPushConfig buildMixPushConfig() {

        // 第三方推送配置
        MixPushConfig config = new MixPushConfig();

        // 小米推送
        config.xmAppId = "2882303761517502883";
        config.xmAppKey = "5671750254883";
        config.xmCertificateName = "DEMO_MI_PUSH";

        // 华为推送
        config.hwCertificateName = "DEMO_HW_PUSH";

        // 魅族推送
        config.mzAppId = "111710";
        config.mzAppKey = "282bdd3a37ec4f898f47c5bbbf9d2369";
        config.mzCertificateName = "DEMO_MZ_PUSH";

        // fcm 推送，适用于海外用户，不使用fcm请不要配置
//        config.fcmCertificateName = "DEMO_FCM_PUSH";

        return config;
    }
    /**
     * 配置 APP 保存图片/语音/文件/log等数据的目录
     * 这里示例用SD卡的应用扩展存储目录
     */
    static String getAppCacheDir(Context context) {
        String storageRootPath = null;
        try {
            // SD卡应用扩展存储区(APP卸载后，该目录下被清除，用户也可以在设置界面中手动清除)，请根据APP对数据缓存的重要性及生命周期来决定是否采用此缓存目录.
            // 该存储区在API 19以上不需要写权限，即可配置 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18"/>
            if (context.getExternalCacheDir() != null) {
                storageRootPath = context.getExternalCacheDir().getCanonicalPath();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (TextUtils.isEmpty(storageRootPath)) {
            // SD卡应用公共存储区(APP卸载后，该目录不会被清除，下载安装APP后，缓存数据依然可以被加载。SDK默认使用此目录)，该存储区域需要写权限!
            storageRootPath = Environment.getExternalStorageDirectory() + "/${applicationId}";
        }

        return storageRootPath;
    }

    private LoginInfo getLoginInfo() {
        User user = UserManager.getInstance().getUser();
        if(user!=null&&user.getYunxinAccount()!=null&&!user.getYunxinAccount().equals("")){
            String account = String.valueOf(user.getYunxinAccount());
            String token = "123456";
            if (!TextUtils.isEmpty(account) && !TextUtils.isEmpty(token)) {
//                DemoCache.setAccount(account.toLowerCase());
                return new LoginInfo(account, token);
            }
        }
        return null;
    }



    public static App getInstance() {
        return sInstance;
    }

    /**
     * 获得当前进程的名字
     *
     * @param context
     * @return 进程号
     */
    public static String getCurProcessName(Context context) {

        int pid = android.os.Process.myPid();

        ActivityManager activityManager = (ActivityManager) context
                .getSystemService(Context.ACTIVITY_SERVICE);

        for (ActivityManager.RunningAppProcessInfo appProcess : activityManager
                .getRunningAppProcesses()) {

            if (appProcess.pid == pid) {
                return appProcess.processName;
            }
        }
        return null;
    }


    private void initExceptionHandler() {
        mExceptionHandler = new DefaultUncaughtExceptionHandler(this
                , Constant.LOG_DIR) {
            @Override
            protected void countErr(String err) {
            }
        };
    }
}
